bitkeeper revision 1.1159.1.247 (41770cc6Kk3qrDm03nejgR15F8G8Ng)
authormwilli2@equilibrium.research <mwilli2@equilibrium.research>
Thu, 21 Oct 2004 01:11:34 +0000 (01:11 +0000)
committermwilli2@equilibrium.research <mwilli2@equilibrium.research>
Thu, 21 Oct 2004 01:11:34 +0000 (01:11 +0000)
Full balloon driver support for 2.6, including control interface
and plumbing into xend / xm.

linux-2.6.8.1-xen-sparse/drivers/xen/balloon/balloon.c
tools/python/xen/lowlevel/xu/xu.c
tools/python/xen/xend/XendClient.py
tools/python/xen/xend/XendDomain.py
tools/python/xen/xend/server/SrvDaemon.py
tools/python/xen/xend/server/SrvDomain.py
tools/python/xen/xend/server/domain.py
tools/python/xen/xend/server/messages.py
tools/python/xen/xm/main.py
xen/include/hypervisor-ifs/io/domain_controller.h

index fda84b3590a284fae69cefdafc22307b6137b041..47b7c796ec6a062fd69fc8fbb72053a4548b6350 100644 (file)
@@ -521,7 +521,7 @@ static int __init balloon_init(void)
 {
     printk(KERN_ALERT "Starting Xen Balloon driver\n");
 
-    most_seen_pages = current_pages = min(start_info.nr_pages,max_pfn);
+    most_seen_pages = current_pages = min(xen_start_info.nr_pages,max_pfn);
     if ( (balloon_pde = create_xen_proc_entry("memory_target", 0644)) == NULL )
     {
         printk(KERN_ALERT "Unable to create balloon driver proc entry!");
@@ -538,14 +538,14 @@ static int __init balloon_init(void)
     /* 
      * make_module a new phys map if mem= says xen can give us memory  to grow
      */
-    if ( max_pfn > start_info.nr_pages )
+    if ( max_pfn > xen_start_info.nr_pages )
     {
         extern unsigned long *phys_to_machine_mapping;
         unsigned long *newmap;
         newmap = (unsigned long *)vmalloc(max_pfn * sizeof(unsigned long));
         memset(newmap, ~0, max_pfn * sizeof(unsigned long));
         memcpy(newmap, phys_to_machine_mapping,
-               start_info.nr_pages * sizeof(unsigned long));
+               xen_start_info.nr_pages * sizeof(unsigned long));
         phys_to_machine_mapping = newmap;
     }
 
index 9267d6596790e8477d7a4d357be329245e1678b1..db3aa1d5d4b6f97a825ef98ca4090b62dbc8919f 100644 (file)
@@ -479,6 +479,10 @@ static PyObject *xu_message_get_payload(PyObject *self, PyObject *args)
     case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DRIVER_STATUS):
         C2P(netif_be_driver_status_t, status, Int, Long);
         return dict;
+    case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET):
+        C2P(mem_request_t, target, Int, Long);
+        C2P(mem_request_t, status, Int, Long);
+        return dict;
     }
 
     return PyString_FromStringAndSize(xum->msg.msg, xum->msg.length);
@@ -640,6 +644,10 @@ static PyObject *xu_message_new(PyObject *self, PyObject *args)
         P2C(netif_fe_driver_status_t, status,        u32);
         P2C(netif_fe_driver_status_t, max_handle,    u32);
         break;
+    case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET):
+        P2C(mem_request_t, target, u32);
+        P2C(mem_request_t, status, u32);
+        break;
     }
 
     if ( dict_items_parsed != PyDict_Size(payload) )
index 4ebb6acbea13ec7438192beeb1636fed36a61289..13a2d63b52f15e8a484dfc8a8b576a503e4971bc 100644 (file)
@@ -350,6 +350,12 @@ class Xend:
                              {'op'      : 'inject',
                               'event'   : fileof(sxpr) })
 
+    def xend_domain_mem_target_set(self, id, mem_target):
+        val = self.xendPost(self.domainurl(id),
+                            {'op'         : 'mem_target_set',
+                             'target'     : mem_target })
+        return val
+
 def getAsynchXendClientProtocol():
     """Load AsynchXendClientProtocol on demand to avoid the cost.
     """
index 5532d5b98f29c34b5fe7edcd0ff4dc1e7169e5e6..e79357e82f33eb832f36a6359cf74292d7e8b9fc 100644 (file)
@@ -811,6 +811,10 @@ class XendDomain:
         except Exception, ex:
             raise XendError(str(ex))
 
+    def domain_mem_target_set(self, id, target):
+        return xend.domain_mem_target_set(id, target)
+        
+
 
 def instance():
     """Singleton constructor. Use this instead of the class constructor.
index f3f72b3dd4c30e06656c76a313e644a0cf20dc69..c6c4282eee22f66f0631b2277faa8d5ac9d620ea 100644 (file)
@@ -706,6 +706,16 @@ class Daemon:
             raise XendError('No domain controller: %s' % dom)
         ctrl.shutdown(reason)
         return 0
+
+    def domain_mem_target_set(self, dom, target):
+        """Set memory target for a domain.
+        """
+        dom = int(dom)
+        ctrl = self.domainCF.getController(dom)
+        if not ctrl:
+            raise XendError('No domain controller: %s' % dom)
+        ctrl.mem_target_set(target)
+        return 0
         
 def instance():
     global inst
index a0ec17526f346e3390508cb96a8833c31fbb6df5..ef3b64c8d04dfc6ad898e6200ffd93399075dcd2 100644 (file)
@@ -194,12 +194,19 @@ class SrvDomain(SrvDir):
         val = fn(req.args, {'dom': self.dom.id})
         return val
 
+    def op_mem_target_set(self, op, req):
+        fn = FormFn(self.xd.domain_mem_target_set,
+                    [['dom', 'str'],
+                     ['target', 'int']])
+        val = fn(req.args, {'dom': self.dom.id})
+        return val
+
     def render_POST(self, req):
         return self.perform(req)
         
     def render_GET(self, req):
         op = req.args.get('op')
-        if op and op[0] in ['vifs', 'vif', 'vbds', 'vbd']:
+        if op and op[0] in ['vifs', 'vif', 'vbds', 'vbd', 'mem_target_set']:
             return self.perform(req)
         if self.use_sxp(req):
             req.setHeader("Content-Type", sxp.mime_type)
index 5ed26c7ca2f862edadea67b58eaf030ebc097201..4e1baf64dee3865ce540df927a07f1450a27ab69 100644 (file)
@@ -33,6 +33,7 @@ class DomainController(controller.Controller):
     def __init__(self, factory, dom):
         controller.Controller.__init__(self, factory, dom)
         self.addMethod(CMSG_SHUTDOWN, 0, None)
+        self.addMethod(CMSG_MEM_REQUEST, 0, None)
         self.registerChannel()
 
     def shutdown(self, reason):
@@ -45,3 +46,9 @@ class DomainController(controller.Controller):
             raise XendError('invalid reason:' + reason)
         msg = packMsg(msgtype, {})
         self.writeRequest(msg)
+
+    def mem_target_set(self, target):
+        """Set domain memory target in pages.
+        """
+        msg = packMsg('mem_request_t', { 'target' : target * (1 << 8)} )
+        self.writeRequest(msg)
index da4980fc960d5f3bb4bd5ba50573d7415d0c3a7d..081dd9ce3274724cfc17e392de6f4777ff72d17b 100644 (file)
@@ -216,7 +216,20 @@ shutdown_formats = {
 msg_formats.update(shutdown_formats)
 
 #============================================================================
+# Domain memory reservation message.
+#============================================================================
+
+CMSG_MEM_REQUEST = 7
+CMSG_MEM_REQUEST_SET = 0
+
+mem_request_formats = {
+    'mem_request_t':
+    (CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET)
+    }
+
+msg_formats.update(mem_request_formats)
 
+#============================================================================
 class Msg:
     pass
 
index 797be02ae3f73c5aa72f1b2cd444180a97091c0e..82acffddc54f7d6946ef3bcc8a368e91c2007f94 100644 (file)
@@ -466,6 +466,24 @@ class ProgMaxmem(Prog):
 
 xm.prog(ProgMaxmem)
 
+class ProgBalloon(Prog):
+    group = 'domain'
+    name  = 'balloon'
+    info  = """Set the domain's memory footprint using the balloon driver."""
+
+    def help(self, args):
+        print args[0], "DOM MEMORY_TARGET"
+        print """\nRequest domain DOM to adjust its memory footprint to
+MEMORY_TARGET megabytes"""
+
+    def main(self, args):
+        if len(args) != 3: self.err("%s: Invalid argument(s)" % args[0])
+        dom = args[1]
+        mem_target = int(args[2])
+        server.xend_domain_mem_target_set(dom, mem_target)
+
+xm.prog(ProgBalloon)
+
 class ProgDomid(Prog):
     group = 'domain'
     name = 'domid'
index b660987f0dfa0507c3912ed271ac338677365a8e..ab04072fe838d1762cf93a3cca9377dc811de4d9 100644 (file)
@@ -53,6 +53,7 @@ typedef struct {
 #define CMSG_NETIF_BE       3  /* Network-device backend  */
 #define CMSG_NETIF_FE       4  /* Network-device frontend */
 #define CMSG_SHUTDOWN       6  /* Shutdown messages       */
+#define CMSG_MEM_REQUEST    7  /* Memory reservation reqs */
 
 
 /******************************************************************************
@@ -555,4 +556,23 @@ typedef struct {
 #define CMSG_SHUTDOWN_SUSPEND   2   /* Create suspend info, then             */
                                     /* SHUTDOWN_suspend.                     */
 
+
+/******************************************************************************
+ * MEMORY CONTROLS
+ */
+
+#define CMSG_MEM_REQUEST_SET 0 /* Request a domain to set its mem footprint. */
+
+/*
+ * CMSG_MEM_REQUEST:
+ *  Request that the domain change its memory reservation.
+ */
+typedef struct {
+    /* OUT */
+    u32 target;       /* 0: Target memory reservation in pages.       */
+    /* IN  */
+    u32 status;       /* 4: Return code indicates success or failure. */
+} PACKED mem_request_t; /* 8 bytes */
+
+
 #endif /* __DOMAIN_CONTROLLER_H__ */